// 计算二进制数中1的个数

/**
    第一种方式：
        10101010，每次和1进行与操作，可以判断右边最后一位是否为1。
        右移操作，去掉最后一位，再重复上述操作，一直到数字为0为止

    第二种方式：
        假设，一个数字中有5个1，那么count每++一次就去掉一个1，那么循环5次就够了。
        上述的思想需要知道一个原理：num&(num-1),可以将num中最后一个1变为0.
        即，101010有三个1，每计算一次num&(num-1),就少一个1，过程：101010-->101000-->100000-->000000
*/


#if 1

#include <iostream>

using namespace std;

int count_1(int num)
{

    int count = 0;
    while(num!=0)
    {

        if(num&1)
        {
            count++;
        }
        num = num>>1;
    }
    return count;
}

int count_2(int num)
{
    int count = 0;
    while(num!=0)
    {
        count++;
        num = num&(num-1);
    }
    return count;
}
int main()
{

    //测试
    //int a = 8;
    int a;
    cout<<"请输入数值："<<endl;
    cin>>a;
    cout<<"count1:数字"<<a<<"中包含1的个数:"<<count_1(a)<<endl;
    cout<<"count2:数字"<<a<<"中包含1的个数:"<<count_2(a)<<endl;
	system("pause");
	return 0;
}
#endif
